package com;
/*
 * Clase que representa una figura o tambien llamada ficha.
 */

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;

/**
 * @author Alex Muñoz   -   Mauricio Orellana.
 * @version 2012-07-13
 */
public class Figure extends JPanel
{
    private int up;
    private int down;
    private int left;
    private int right;
    private boolean pressed;

    /**
     * Constructor de objetos de la clase Figure
     * 
     * @param up El valor entero de la posición superior
     * @param down El valor entero de la posición inferior
     * @param left El valor entero de la posición izquierda
     * @param right El valor entero de la posición derecha
     */
    public Figure( int up, int down, int left, int right)
    {
        super();
        this.up = up;
        this.down = down;
        this.left = left;
        this.right = right;
        this.pressed = false;
    }
    
    
    @Override
    public void paint(Graphics g)
    {      
     
        this.createTriangle(g, new Point(0,0), new Point(this.getWidth(),0), new Point(this.getWidth()/2, this.getHeight()/2), this.up);
        g.drawImage(Icons.getIconNumber(up), (int)(this.getWidth()/2.5), this.getHeight()/10, this);
       
        this.createTriangle(g, new Point(0,0), new Point(this.getWidth()/2, this.getHeight()/2), new Point(0,this.getHeight()), this.left);
        g.drawImage(Icons.getIconNumber(this.left), 10, 37, this);
       
        this.createTriangle(g, new Point(0,this.getHeight()), new Point(this.getWidth(),this.getHeight()),new Point(this.getWidth()/2, this.getHeight()/2),this.down);
        g.drawImage(Icons.getIconNumber(this.down), (int)(this.getWidth()/2.6), 70, this);
       
        this.createTriangle(g,new Point(this.getWidth(),this.getHeight()), new Point(this.getWidth(),0), new Point(this.getWidth()/2, this.getHeight()/2),this.right);
        g.drawImage(Icons.getIconNumber(this.right), 70, 37, this);
       
        g.setColor(Color.BLACK);
        g.drawLine(0, 0,this.getWidth(), this.getHeight());
        g.drawLine(0,  this.getHeight(),this.getWidth(),0);
        g.drawRect(0, 0, this.getWidth(), this.getHeight());
    }
   
    /**
     * Pinta un triángulo
     * 
     * @param g El elemento gráfico.
     * @param p1 El punto 1 del triángulo
     * @param p2 El punto 2 del triángulo
     * @param p3 El punto 3 del triángulo
     * @param value El valor entero que se colocará en el triángulo.
     */
    public void createTriangle(Graphics g, Point p1,Point p2, Point p3, int value)
    {
        Polygon polygon = new Polygon();
        polygon.reset();
        polygon.addPoint(p1.x, p1.y);
        polygon.addPoint(p2.x, p2.y);
        polygon.addPoint(p3.x, p3.y);
        g.setColor(getColor(value));
        g.fillPolygon(polygon);
    }
    
    
    /**
     * Retorna el color asociado a cierto numero.
     * 
     * @param value Un numero entero.
     * @return El color asociado al numero.
     */
    public Color getColor(int value)
    {
        switch(value){
            case 1:
                return Color.PINK;
            case 2:
                return Color.RED;
            case 3:
                return Color.ORANGE;
            case 4:
                return Color.YELLOW;
            case 5:
                return Color.GREEN;
            case 6:
                return Color.BLUE;
            case 7:
                return Color.MAGENTA;
            case 8:
                return Color.GRAY;
            case 9:
                return Color.WHITE;
            default:
                return Color.BLACK;
            }   
    }
    
    /**
     * Retorna el valor inferior de la figura.
     * 
     * @return Retorna el valor inferior de la figura.
     */
    public int getDown() {
        return this.down;
    }

    /**
     * Modifica el valor de la posición inferior de la figura.
     * 
     * @param down El nuevo valor de la posición inferior de la figura. 
     */
    public void setDown(int down) {
        this.down = down;
    }

    /**
     * Retorna el valor de la posición izquierda de la figura. 
     * 
     * @return Retorna el valor de la posición izquierda de la figura. 
     */
    public int getLeft() {
        return this.left;
    }
  
    /**
     * Modifica el valor de la posición izquierda de la figura.
     * 
     * @param left El nuevo valor de la posición izquierda de la figura.
     */
    public void setLeft(int left) {
        this.left = left;
    }
   
    /**
     * Retorna el estado de presionado con el que se encuentra la figura.
     * 
     * @return Retorna verdadero si la figura se encuentra presionada, falso si no se encuentra presionada.
     */
    public boolean isPressed() {
        return this.pressed;
    }
 
    /**
     * Modifica el valor de presionado de la figura.
     * 
     * @param pressed El nuevo estado de presionado de la figura.
     */
    public void setPressed(boolean pressed) {
        this.pressed = pressed;
    }

    /**
     * Retorna el valor de la posición derecha de la figura.
     * 
     * @return El valor de la posición derecha de la figura. 
     */
    public int getRight() {
        return right;
    }

    /**
     * Modifica el valor de la posición derecha de la figura.
     * 
     * @param right El nuevo valor de la posición derecha de la figura. 
     */
    public void setRight(int right) {
        this.right = right;
    }

    /**
     * Retorna el valor de la posición superior de la figura. 
     * 
     * @return Retorna el valor de la posición superior de la figura. 
     */
    public int getUp() {
        return this.up;
    }

    /**
     * Modifica el valor de la posición superior de la figura.
     * 
     * @param up El nuevo valor de la posición superior de la figura. 
     */
    public void setUp(int up) {
        this.up = up;
    }

    /**
     * Retorna el estado de presionado de la figura a partir de un punto.
     * 
     * @param point Un punto de la ventana.
     * @return Verdadero si el punto pertenece a la figura, falso si el punto no pertenece a la figura.
     */
    public boolean isPresed(Point point)
    {
        if(point.x > this.getX() && point.y > this.getY() && point.x< (this.getX() + this.getWidth()) && point.y < (this.getY() + this.getHeight())){
            return true;
        }
        return false;
    }
}
